#ifndef ANALYSE_SYNTAXIQUE_BIS
#define ANALYSE_SYNTAXIQUE_BIS
#include "gestiondetypes.h"

LIGNE_INSTRUCT_ASM * main_analysesyntaxiquebis(LIGNE_INSTRUCT_ASM *t_instruct, LISTE Letiquette, INSTRUCTION *dico_instruct );


int contient_symb(LIGNE_INSTRUCT_ASM ligne);
/*
 /!\  un symbole ne peut être maintenant qu'une etiquette


 Renvoie 0 en cas d'absence de symbole dans une LIGNE_INSTRUCT_ASM
 Sinon renvoie la position (argument 1, 2... 4) du premier symbole.

 */


ELEMENT_ETIQUETTE* identif_etiquette(ELEMENT_LEXEME lexeme, LISTE Letiquette);
// Renvoie un pointeur sur l'etiquette corespondant au lexeme s'il est bien une etiquette

void remplacer_etq(LIGNE_INSTRUCT_ASM* instruct,int ligne,LISTE Letiquette, INSTRUCTION* dico_instruct);
//prend une ligne contenant une (ou plusieurs) etiquettes et les remplace
//par leur valeur

void incrementer_liste_etiquette(LISTE Letiquette,int indice_etq);
// doit mettre les valeurs d'etiquettes a jour

LIGNE_INSTRUCT_ASM *ajout_tab_ligne_instruct(LIGNE_INSTRUCT_ASM* t_instruct,int offset, INSTRUCTION* dico_instruct);
/*
 Prend en entree :
	1 - le tableau d'instruction ;
	2 - la ligne a laquelle il faut rajouter une instruction.
 Renvoie en sortie :
	le nouveau tableau d'instruction.

 Principe de fonctionnement :
	- il prend 1 et le realloue de son nombre d'element + 1 ;
	- il decale ensuite tous les elements suivant la ligne a
 laquelle il faut rajouter une instruction

 */
void decaler_ligne_instruct_vers_droite(LIGNE_INSTRUCT_ASM* tab,int offset, INSTRUCTION * dico);
//semblable a decaler_caractere_vers_droite (voir livrable I)

int tab_ligne_instruct_leng(LIGNE_INSTRUCT_ASM* t_instruct, INSTRUCTION * dico);
//semblable a strleng


void remplacer_ligne_instruct(LIGNE_INSTRUCT_ASM* tab,int i,INSTRUCTION *dico_instruct);

void verif_type_argument_instruct(LIGNE_INSTRUCT_ASM *L, INSTRUCTION *dico_instruct);

void traduire_liste_data(LIGNE_DIRECTIVE_ASM* liste_data);

int lire_nombre(LISTE ligne_compliquee);

int compte_variables(LISTE* ligne);

unsigned int calculer_adresse_segment_data(TYPE_DE_DIRECTIVE type_directive, unsigned int adresse_en_cours, unsigned int nombre_de_valeurs, int valeur);



int lire_adressage_indirect(LISTE ligne_compliquee, int *val_registre);


LIGNE_DIRECTIVE_ASM * construire_segment_data(LIGNE_DIRECTIVE_ASM* tableau_directives,LISTE Letq);

unsigned int aligner(unsigned int adresse_en_cours);




void reaffecter_etq_data(LISTE Letq, unsigned int indice_data, unsigned int adresse_data);






#endif
